﻿#pragma once

#include "MathOperation.h"

namespace ASL
{

    // F16战隼式战斗机气动特性模型
    class ASL_API F16AeroDynamics
    {
    public:
        // 构造函数
        F16AeroDynamics();

        // 析构函数
        ~F16AeroDynamics();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;

            // 侧滑角 deg
            double beta;

            // 角速度 deg/s 机体系 [X, Y, Z]
            ASL::Vector omega;

            // 真实空速 m/s
            double vTAS;

            // 相对地面高度 m
            double altitudeGL;

            // 动压 Pa
            double dynamicPressure;

            // 副翼偏转角 deg
            double aileron;

            // 方向舵偏转角 deg
            double rudder;

            // 升降舵偏转角 deg
            double elevator;

            // 前缘襟翼偏转角 deg
            double leadingEdgeFlap;

            // 后缘襟翼偏转角 deg
            double trailingEdgeFlap;

            // 减速板偏转角 deg
            double speedBrake;

            // 襟副翼偏转角 deg
            double flaperon;

            // 起落架位置 0~1
            double landingGear;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 气动力系数 速度系 [Cx, Cy, Cz]
            ASL::Vector C;

            // 气动力矩系数 机体系 [Mx, My, Mz]
            ASL::Vector M;

            // 气动力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 气动力矩 N*m 机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 参考翼展 m
            double wingSpan;

            // 参考面积 m^2
            double wingArea;

            // 参考气动弦长 m
            double chord;

            // 参考重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CR;
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        F16AeroDynamics::Input input;

        // 输入端口对象
        F16AeroDynamics::Output output;

        // 参数端口对象
        F16AeroDynamics::Parameter parameter;

        // 监控端口对象
        F16AeroDynamics::Watch watch;

    private:
        // 坐标系投影矩阵 速度系>机体系
        ASL::Matrix cV2B;

        // 综合气动系数
        ASL::Vector vCxyz;
        ASL::Vector vMxyz;

        // 附加系数列表
        ASL::LookupTable vKLGroundEffect;

        // 阻力系数列表
        ASL::LookupTable vCxElevator;
        ASL::LookupTable vCxMach;
        ASL::LookupTable vCxLeadingEdgeFlap;
        double vCxTrailingEdgeFlap;
        double vCxGear;
        ASL::LookupTable vCxSpeedBrake;
        ASL::LookupTable vCxPitchRate;
        ASL::LookupTable vCxPitchRateLeadingEdgeFlap;

        // 升力系数列表
        ASL::LookupTable vCyElevator;
        ASL::LookupTable vCyLeadingEdgeFlap;
        double vCyTrailingEdgeFlap;
        ASL::LookupTable vCySpeedBrake;
        ASL::LookupTable vCyPitchRate;
        ASL::LookupTable vCyPitchRateSpeedBrake;

        // 侧向力系数列表
        double vCzBeta;
        ASL::LookupTable vCzBetaMach;
        double vCzAileron;
        double vCzRudder;
        ASL::LookupTable vCzRollRate;
        ASL::LookupTable vCzYawRate;

        // 滚动力矩系数列表
        ASL::LookupTable vMxBeta;
        ASL::LookupTable vMxBetaMach;
        ASL::LookupTable vMxRollRate;
        ASL::LookupTable vMxYawRate;
        ASL::LookupTable vMxAileron;
        ASL::LookupTable vMxAileronMach;
        ASL::LookupTable vMxRudder;
        ASL::LookupTable vMxRudderMach;

        // 航向力矩系数列表
        ASL::LookupTable vMyBeta;
        ASL::LookupTable vMyBetaMach;
        ASL::LookupTable vMyRollRate;
        ASL::LookupTable vMyYawRate;
        ASL::LookupTable vMyAileron;
        ASL::LookupTable vMyAileronMach;
        ASL::LookupTable vMyRudder;
        ASL::LookupTable vMyRudderMach;

        // 俯仰力矩系数列表
        ASL::LookupTable vMzElevator;
        ASL::LookupTable vMzAlphaMach;
        ASL::LookupTable vMzSpeedBrake;
        ASL::LookupTable vMzPitchRate;
    };

    // F22猛禽式战斗机气动特性模型
    class ASL_API F22AeroDynamics
    {
    public:
        // 构造函数
        F22AeroDynamics();

        // 析构函数
        ~F22AeroDynamics();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;
            double alphaDot;

            // 侧滑角 deg
            double beta;
            double betaDot;

            // 角速度 deg/s 机体系 [X, Y, Z]
            ASL::Vector omega;

            // 真实空速 m/s
            double vTAS;

            // 相对地面高度 m
            double altitudeGL;

            // 动压 Pa
            double dynamicPressure;

            // 副翼偏转角 deg
            double aileron;

            // 方向舵偏转角 deg
            double rudder;

            // 升降舵偏转角 deg
            double elevator;

            // 前缘襟翼偏转角 deg
            double leadingEdgeFlap;

            // 后缘襟翼偏转角 deg
            double trailingEdgeFlap;

            // 减速板偏转角 deg
            double speedBrake;

            // 推力矢量偏转角 deg
            double thrustVector;

            // 额定推力 N
            double thrust;

            // 起落架位置 0~1
            double landingGear;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 气动力系数 速度系 [Cx, Cy, Cz]
            ASL::Vector C;

            // 气动力矩系数 机体系 [Mx, My, Mz]
            ASL::Vector M;

            // 气动力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 气动力矩 N*m 机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 参考翼展 m
            double wingSpan;

            // 参考面积 m^2
            double wingArea;

            // 参考气动弦长 m
            double chord;

            // 参考重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CR;
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        F22AeroDynamics::Input input;

        // 输入端口对象
        F22AeroDynamics::Output output;

        // 参数端口对象
        F22AeroDynamics::Parameter parameter;

        // 监控端口对象
        F22AeroDynamics::Watch watch;

    private:
        // 坐标系投影矩阵 速度系>机体系
        ASL::Matrix cV2B;

        // 综合气动系数
        ASL::Vector vCxyz;
        ASL::Vector vMxyz;

        // 附加系数列表
        ASL::LookupTable vKDGroundEffect;
        ASL::LookupTable vKLGroundEffect;

        // 阻力系数列表
        ASL::LookupTable vCxZero;
        double vCxInduced;
        ASL::LookupTable vCxMach;
        double vCxTrailingEdgeFlap;
        double vCxGear;
        double vCxSpeedBrake;
        ASL::LookupTable vCxBeta;
        ASL::LookupTable vCxElevator;
        ASL::LookupTable vCxLeadingEdgeFlap;
        ASL::LookupTable vCxPitchRate;
        ASL::LookupTable vCxPitchRateLeadingEdgeFlap;

        // 升力系数列表
        ASL::LookupTable vCyAlpha;
        ASL::LookupTable vCyLeadingEdgeFlap;
        double vCyAlphaDot;
        ASL::LookupTable vCyPitchRate;
        double vCyTrailingEdgeFlap;
        double vCySpeedBrake;
        double vCyElevator;

        // 侧向力系数列表
        double vCzBeta;
        double vCzBetaMach;
        double vCzBetaDot;
        double vCzAileron;
        double vCzRudder;
        double vCzRollRate;
        double vCzYawRate;

        // 滚动力矩系数列表
        ASL::LookupTable vMxBeta;
        ASL::LookupTable vMxAileron;
        ASL::LookupTable vMxAileronMach;
        ASL::LookupTable vMxRudder;
        ASL::LookupTable vMxRudderMach;
        double vMxBetaDot;
        ASL::LookupTable vMxRollRate;
        ASL::LookupTable vMxYawRate;

        // 航向力矩系数列表
        ASL::LookupTable vMyBeta;
        ASL::LookupTable vMyBetaMach;
        double vMyBetaDot;
        double vMyRollRate;
        ASL::LookupTable vMyYawRate;
        ASL::LookupTable vMyRudder;
        ASL::LookupTable vMyRudderMach;
        ASL::LookupTable vMyAileron;

        // 俯仰力矩系数列表
        ASL::LookupTable vMzElevator;
        ASL::LookupTable vMzThrustVector;
        ASL::LookupTable vMzAlphaMach;
        ASL::LookupTable vMzPitchRate;
        ASL::LookupTable vMzAlphaDot;
    };

    // A320空客系列民航客机气动特性模型
    class ASL_API A320AeroDynamics
    {
    public:
        // 构造函数
        A320AeroDynamics();

        // 析构函数
        ~A320AeroDynamics();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;
            double alphaDot;

            // 侧滑角 deg
            double beta;

            // 角速度 deg/s 机体系 [X, Y, Z]
            ASL::Vector omega;

            // 真实空速 m/s
            double vTAS;

            // 动压 Pa
            double dynamicPressure;

            // 副翼偏转角 deg
            double aileron;

            // 方向舵偏转角 deg
            double rudder;

            // 升降舵偏转角 deg
            double elevator;

            // 襟翼偏转角 deg
            double flap;

            // 减速板位置 0~1
            double speedBrake;

            // 起落架位置 0~1
            double landingGear;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 气动力系数 速度系 [Cx, Cy, Cz]
            ASL::Vector C;

            // 气动力矩系数 机体系 [Mx, My, Mz]
            ASL::Vector M;

            // 气动力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 气动力矩 N*m 机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 参考翼展 m
            double wingSpan;

            // 参考面积 m^2
            double wingArea;

            // 参考气动弦长 m
            double chord;

            // 参考重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CR;
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        A320AeroDynamics::Input input;

        // 输入端口对象
        A320AeroDynamics::Output output;

        // 参数端口对象
        A320AeroDynamics::Parameter parameter;

        // 监控端口对象
        A320AeroDynamics::Watch watch;

    private:
        // 坐标系投影矩阵 速度系>机体系
        ASL::Matrix cV2B;

        // 综合气动系数
        ASL::Vector vCxyz;
        ASL::Vector vMxyz;

        // 阻力系数列表
        double vCxZero;
        ASL::LookupTable vCxAlpha;
        double vCxElevator;
        double vCxBeta;
        double vCxGear;
        double vCxSpeedBrake;

        // 升力系数列表
        ASL::LookupTable vCyAlpha;
        double vCyElevator;

        // 侧向力系数列表
        ASL::LookupTable vCzBeta;

        // 滚动力矩系数列表
        ASL::LookupTable vMxBeta;
        double vMxRollRate;
        double vMxYawRate;
        double vMxAileron;
        double vMxRudder;

        // 航向力矩系数列表
        double vMyBeta;
        double vMyYawRate;
        double vMyRudder;

        // 俯仰力矩系数列表
        ASL::LookupTable vMzZero;
        double vMzAlpha;
        double vMzElevator;
        double vMzPitchRate;
        double vMzAlphaDot;
    };

    // B737波音系列民航客机气动特性模型
    class ASL_API B737AeroDynamics
    {
    public:
        // 构造函数
        B737AeroDynamics();

        // 析构函数
        ~B737AeroDynamics();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;
            double alphaDot;

            // 侧滑角 deg
            double beta;

            // 角速度 deg/s 机体系 [X, Y, Z]
            ASL::Vector omega;

            // 真实空速 m/s
            double vTAS;

            // 相对地面高度 m
            double altitudeGL;

            // 动压 Pa
            double dynamicPressure;

            // 副翼偏转角 deg
            double aileron;

            // 方向舵偏转角 deg
            double rudder;

            // 升降舵偏转角 deg
            double elevator;

            // 襟翼位置 0~1
            double flap;

            // 减速板位置 0~1
            double speedBrake;

            // 扰流板位置 0~1
            double spoiler;

            // 起落架位置 0~1
            double landingGear;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 气动力系数 速度系 [Cx, Cy, Cz]
            ASL::Vector C;

            // 气动力矩系数 机体系 [Mx, My, Mz]
            ASL::Vector M;

            // 气动力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 气动力矩 N*m 机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 参考翼展 m
            double wingSpan;

            // 参考面积 m^2
            double wingArea;

            // 参考气动弦长 m
            double chord;

            // 参考重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CR;
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        B737AeroDynamics::Input input;

        // 输入端口对象
        B737AeroDynamics::Output output;

        // 参数端口对象
        B737AeroDynamics::Parameter parameter;

        // 监控端口对象
        B737AeroDynamics::Watch watch;

    private:
        // 坐标系投影矩阵 速度系>机体系
        ASL::Matrix cV2B;

        // 综合气动系数
        ASL::Vector vCxyz;
        ASL::Vector vMxyz;

        // 附加系数列表
        ASL::LookupTable vKDGroundEffect;
        ASL::LookupTable vKLGroundEffect;
        double vKLSpeedBrake;
        double vKLSpoiler;

        // 阻力系数列表
        ASL::LookupTable vCxZero;
        double vCxInduced;
        ASL::LookupTable vCxMach;
        double vCxFlap;
        double vCxGear;
        double vCxSpeedBrake;
        double vCxSpoiler;
        ASL::LookupTable vCxBeta;
        double vCxElevator;

        // 升力系数列表
        ASL::LookupTable vCyAlpha;
        double vCyFlap;
        double vCyElevator;

        // 侧向力系数列表
        double vCzBeta;

        // 滚动力矩系数列表
        double vMxBeta;
        double vMxRollRate;
        double vMxYawRate;
        ASL::LookupTable vMxAileron;
        double vMxRudder;

        // 航向力矩系数列表
        double vMyBeta;
        double vMyYawRate;
        double vMyRudder;

        // 俯仰力矩系数列表
        double vMzAlpha;
        ASL::LookupTable vMzElevator;
        double vMzPitchRate;
        double vMzAlphaDot;
    };

    // X24升力体试验机气动特性模型
    class ASL_API X24AeroDynamics
    {
    public:
        // 构造函数
        X24AeroDynamics();

        // 析构函数
        ~X24AeroDynamics();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 真实空速 m/s
            double vTAS;

            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;

            // 侧滑角 deg
            double beta;

            // 角速度 deg/s 机体系 [X, Y, Z]
            ASL::Vector omega;

            // 动压 Pa
            double dynamicPressure;

            // 副翼偏转角 deg
            double aileron;

            // 方向舵偏转角 deg
            double rudder;

            // 升降舵偏转角 deg
            double elevator;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 气动力系数 速度系 [Cx, Cy, Cz]
            ASL::Vector C;

            // 气动力矩系数 机体系 [Mx, My, Mz]
            ASL::Vector M;

            // 气动力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 气动力矩 N*m 机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 参考翼展 m
            double wingSpan;

            // 参考面积 m^2
            double wingArea;

            // 参考气动弦长 m
            double chord;

            // 参考重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CR;
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        X24AeroDynamics::Input input;

        // 输入端口对象
        X24AeroDynamics::Output output;

        // 参数端口对象
        X24AeroDynamics::Parameter parameter;

        // 监控端口对象
        X24AeroDynamics::Watch watch;

    private:
        // 坐标系投影矩阵 速度系>机体系
        ASL::Matrix cV2B;

        // 综合气动系数
        ASL::Vector vCxyz;
        ASL::Vector vMxyz;

        // 阻力系数列表
        double vCxZero;
        double vCxInduced;

        // 升力系数列表
        double vCyAlpha;
        double vCyElevator;

        // 侧向力系数列表
        double vCzBeta;
        double vCzAileron;
        double vCzRudder;

        // 滚动力矩系数列表
        double vMxBeta;
        double vMxAileron;
        double vMxRudder;
        double vMxRollRate;
        double vMxYawRate;

        // 航向力矩系数列表
        double vMyBeta;
        double vMyAileron;
        double vMyRudder;
        double vMyRollRate;
        double vMyYawRate;

        // 俯仰力矩系数列表
        double vMzAlpha;
        double vMzElevator;
        double vMzPitchRate;
    };

    // C130大力神运输机气动特性模型
    class ASL_API C130AeroDynamics
    {
    public:
        // 构造函数
        C130AeroDynamics();

        // 析构函数
        ~C130AeroDynamics();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;
            double alphaDot;

            // 侧滑角 deg
            double beta;

            // 角速度 deg/s 机体系 [X, Y, Z]
            ASL::Vector omega;

            // 真实空速 m/s
            double vTAS;

            // 动压 Pa
            double dynamicPressure;

            // 副翼偏转角 deg
            double aileron;

            // 方向舵偏转角 deg
            double rudder;

            // 升降舵偏转角 deg
            double elevator;

            // 襟翼偏转角 deg
            double flap;

            // 减速板位置 0~1
            double speedBrake;

            // 起落架位置 0~1
            double landingGear;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 气动力系数 速度系 [Cx, Cy, Cz]
            ASL::Vector C;

            // 气动力矩系数 机体系 [Mx, My, Mz]
            ASL::Vector M;

            // 气动力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 气动力矩 N*m 机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 参考翼展 m
            double wingSpan;

            // 参考面积 m^2
            double wingArea;

            // 参考气动弦长 m
            double chord;

            // 参考重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CR;
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        C130AeroDynamics::Input input;

        // 输入端口对象
        C130AeroDynamics::Output output;

        // 参数端口对象
        C130AeroDynamics::Parameter parameter;

        // 监控端口对象
        C130AeroDynamics::Watch watch;

    private:
        // 坐标系投影矩阵 速度系>机体系
        ASL::Matrix cV2B;

        // 综合气动系数
        ASL::Vector vCxyz;
        ASL::Vector vMxyz;

        // 阻力系数列表
        ASL::LookupTable vCxZero;
        double vCxInduced;
        ASL::LookupTable vCxMach;
        double vCxFlap;
        double vCxGear;
        double vCxSpeedBrake;
        ASL::LookupTable vCxBeta;
        double vCxElevator;

        // 升力系数列表
        ASL::LookupTable vCyAlpha;
        double vCyFlap;
        double vCySpeedBrake;
        double vCyElevator;

        // 侧向力系数列表
        double vCzBeta;

        // 滚动力矩系数列表
        double vMxBeta;
        double vMxAileron;
        double vMxRudder;
        double vMxRollRate;
        double vMxYawRate;

        // 航向力矩系数列表
        double vMyBeta;
        double vMyAileron;
        double vMyRudder;
        double vMyYawRate;

        // 俯仰力矩系数列表
        double vMzAlpha;
        double vMzElevator;
        double vMzPitchRate;
        double vMzAlphaDot;
    };

}